home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume2
/
aplictns
/
matlab
/
src.7
< prev
Wrap
Internet Message Format
|
1988-11-02
|
15KB
Path: xanth!nic.MR.NET!hal!cwjcc!mailrus!bbn!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v02i047: matlab - matrix laboratory, Part07/11
Message-ID: <10022@swan.ulowell.edu>
Date: 2 Nov 88 21:46:08 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 388
Approved: page@swan.ulowell.edu
Submitted-by: strovink%galaxy-43@afit-ab.arpa (Mark A. Strovink)
Posting-number: Volume 2, Issue 47
Archive-name: applications/matlab/src.7
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# src-7
# This archive created: Wed Nov 2 16:20:51 1988
cat << \SHAR_EOF > src-7
CR = FLOP((ARS*BRS + AIS*BIS)/D)
CI = (AIS*BRS - ARS*BIS)/D
IF (CI .NE. 0.0D0) CI = FLOP(CI)
RETURN
END
SUBROUTINE WSIGN(XR,XI,YR,YI,ZR,ZI)
DOUBLE PRECISION XR,XI,YR,YI,ZR,ZI,PYTHAG,T
C IF Y .NE. 0, Z = X*Y/ABS(Y)
C IF Y .EQ. 0, Z = X
T = PYTHAG(YR,YI)
ZR = XR
ZI = XI
IF (T .NE. 0.0D0) CALL WMUL(YR/T,YI/T,ZR,ZI,ZR,ZI)
RETURN
END
SUBROUTINE WSQRT(XR,XI,YR,YI)
DOUBLE PRECISION XR,XI,YR,YI,S,TR,TI,PYTHAG,FLOP
C Y = SQRT(X) WITH YR .GE. 0.0 AND SIGN(YI) .EQ. SIGN(XI)
C
TR = XR
TI = XI
S = DSQRT(0.5D0*(PYTHAG(TR,TI) + DABS(TR)))
IF (TR .GE. 0.0D0) YR = FLOP(S)
IF (TI .LT. 0.0D0) S = -S
IF (TR .LE. 0.0D0) YI = FLOP(S)
IF (TR .LT. 0.0D0) YR = FLOP(0.5D0*(TI/YI))
IF (TR .GT. 0.0D0) YI = FLOP(0.5D0*(TI/YR))
RETURN
END
SUBROUTINE WLOG(XR,XI,YR,YI)
DOUBLE PRECISION XR,XI,YR,YI,T,R,PYTHAG
C Y = LOG(X)
R = PYTHAG(XR,XI)
IF (R .EQ. 0.0D0) CALL ERROR(32)
IF (R .EQ. 0.0D0) RETURN
T = DATAN2(XI,XR)
IF (XI.EQ.0.0D0 .AND. XR.LT.0.0D0) T = DABS(T)
YR = DLOG(R)
YI = T
RETURN
END
SUBROUTINE WATAN(XR,XI,YR,YI)
C Y = ATAN(X) = (I/2)*LOG((I+X)/(I-X))
DOUBLE PRECISION XR,XI,YR,YI,TR,TI
IF (XI .NE. 0.0D0) GO TO 10
YR = DATAN2(XR,1.0D0)
YI = 0.0D0
RETURN
10 IF (XR.NE.0.0D0 .OR. DABS(XI).NE.1.0D0) GO TO 20
CALL ERROR(32)
RETURN
20 CALL WDIV(XR,1.0D0+XI,-XR,1.0D0-XI,TR,TI)
CALL WLOG(TR,TI,TR,TI)
YR = -TI/2.0D0
YI = TR/2.0D0
RETURN
END
DOUBLE PRECISION FUNCTION WNRM2(N,XR,XI,INCX)
DOUBLE PRECISION XR(1),XI(1),PYTHAG,S
C NORM2(X)
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
DO 10 I = 1, N
S = PYTHAG(S,XR(IX))
S = PYTHAG(S,XI(IX))
IX = IX + INCX
10 CONTINUE
20 WNRM2 = S
RETURN
END
DOUBLE PRECISION FUNCTION WASUM(N,XR,XI,INCX)
DOUBLE PRECISION XR(1),XI(1),S,FLOP
C NORM1(X)
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
DO 10 I = 1, N
S = FLOP(S + DABS(XR(IX)) + DABS(XI(IX)))
IX = IX + INCX
10 CONTINUE
20 WASUM = S
RETURN
END
INTEGER FUNCTION IWAMAX(N,XR,XI,INCX)
DOUBLE PRECISION XR(1),XI(1),S,P
C INDEX OF NORMINF(X)
K = 0
IF (N .LE. 0) GO TO 20
K = 1
S = 0.0D0
IX = 1
DO 10 I = 1, N
P = DABS(XR(IX)) + DABS(XI(IX))
IF (P .GT. S) K = I
IF (P .GT. S) S = P
IX = IX + INCX
10 CONTINUE
20 IWAMAX = K
RETURN
END
SUBROUTINE WRSCAL(N,S,XR,XI,INCX)
DOUBLE PRECISION S,XR(1),XI(1),FLOP
IF (N .LE. 0) RETURN
IX = 1
DO 10 I = 1, N
XR(IX) = FLOP(S*XR(IX))
IF (XI(IX) .NE. 0.0D0) XI(IX) = FLOP(S*XI(IX))
IX = IX + INCX
10 CONTINUE
RETURN
END
SUBROUTINE WSCAL(N,SR,SI,XR,XI,INCX)
DOUBLE PRECISION SR,SI,XR(1),XI(1)
IF (N .LE. 0) RETURN
IX = 1
DO 10 I = 1, N
CALL WMUL(SR,SI,XR(IX),XI(IX),XR(IX),XI(IX))
IX = IX + INCX
10 CONTINUE
RETURN
END
SUBROUTINE WAXPY(N,SR,SI,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION SR,SI,XR(1),XI(1),YR(1),YI(1),FLOP
IF (N .LE. 0) RETURN
IF (SR .EQ. 0.0D0 .AND. SI .EQ. 0.0D0) RETURN
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
YR(IY) = FLOP(YR(IY) + SR*XR(IX) - SI*XI(IX))
YI(IY) = YI(IY) + SR*XI(IX) + SI*XR(IX)
IF (YI(IY) .NE. 0.0D0) YI(IY) = FLOP(YI(IY))
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
RETURN
END
DOUBLE PRECISION FUNCTION WDOTUR(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
S = FLOP(S + XR(IX)*YR(IY) - XI(IX)*YI(IY))
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
20 WDOTUR = S
RETURN
END
DOUBLE PRECISION FUNCTION WDOTUI(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
S = S + XR(IX)*YI(IY) + XI(IX)*YR(IY)
IF (S .NE. 0.0D0) S = FLOP(S)
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
20 WDOTUI = S
RETURN
END
DOUBLE PRECISION FUNCTION WDOTCR(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
S = FLOP(S + XR(IX)*YR(IY) + XI(IX)*YI(IY))
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
20 WDOTCR = S
RETURN
END
DOUBLE PRECISION FUNCTION WDOTCI(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),S,FLOP
S = 0.0D0
IF (N .LE. 0) GO TO 20
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
S = S + XR(IX)*YI(IY) - XI(IX)*YR(IY)
IF (S .NE. 0.0D0) S = FLOP(S)
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
20 WDOTCI = S
RETURN
END
SUBROUTINE WCOPY(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1)
IF (N .LE. 0) RETURN
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
YR(IY) = XR(IX)
YI(IY) = XI(IX)
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE WSET(N,XR,XI,YR,YI,INCY)
INTEGER N,INCY
DOUBLE PRECISION XR,XI,YR(1),YI(1)
IY = 1
IF (N .LE. 0 ) RETURN
DO 10 I = 1,N
YR(IY) = XR
YI(IY) = XI
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE WSWAP(N,XR,XI,INCX,YR,YI,INCY)
DOUBLE PRECISION XR(1),XI(1),YR(1),YI(1),T
IF (N .LE. 0) RETURN
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1, N
T = XR(IX)
XR(IX) = YR(IY)
YR(IY) = T
T = XI(IX)
XI(IX) = YI(IY)
YI(IY) = T
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE RSET(N,DX,DY,INCY)
C
C COPIES A SCALAR, X, TO A SCALAR, Y.
DOUBLE PRECISION DX,DY(1)
C
IF (N.LE.0) RETURN
IY = 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1,N
DY(IY) = DX
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE RSWAP(N,X,INCX,Y,INCY)
DOUBLE PRECISION X(1),Y(1),T
IF (N .LE. 0) RETURN
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX+1
IF (INCY.LT.0) IY = (-N+1)*INCY+1
DO 10 I = 1, N
T = X(IX)
X(IX) = Y(IY)
Y(IY) = T
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE RROT(N,DX,INCX,DY,INCY,C,S)
C
C APPLIES A PLANE ROTATION.
DOUBLE PRECISION DX(1),DY(1),DTEMP,C,S,FLOP
INTEGER I,INCX,INCY,IX,IY,N
C
IF (N.LE.0) RETURN
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO 10 I = 1,N
DTEMP = FLOP(C*DX(IX) + S*DY(IY))
DY(IY) = FLOP(C*DY(IY) - S*DX(IX))
DX(IX) = DTEMP
IX = IX + INCX
IY = IY + INCY
10 CONTINUE
RETURN
END
SUBROUTINE RROTG(DA,DB,C,S)
C
C CONSTRUCT GIVENS PLANE ROTATION.
C
DOUBLE PRECISION DA,DB,C,S,RHO,PYTHAG,FLOP,R,Z
C
RHO = DB
IF ( DABS(DA) .GT. DABS(DB) ) RHO = DA
C = 1.0D0
S = 0.0D0
Z = 1.0D0
R = FLOP(DSIGN(PYTHAG(DA,DB),RHO))
IF (R .NE. 0.0D0) C = FLOP(DA/R)
IF (R .NE. 0.0D0) S = FLOP(DB/R)
IF ( DABS(DA) .GT. DABS(DB) ) Z = S
IF ( DABS(DB) .GE. DABS(DA) .AND. C .NE. 0.0D0 ) Z = FLOP(1.0D0/C)
DA = R
DB = Z
RETURN
END
LOGICAL FUNCTION EQID(X,Y)
C CHECK FOR EQUALITY OF TWO NAMES
INTEGER X(4),Y(4)
EQID = .TRUE.
DO 10 I = 1, 4
10 EQID = EQID .AND. (X(I).EQ.Y(I))
RETURN
END
SUBROUTINE PUTID(X,Y)
C STORE A NAME
INTEGER X(4),Y(4)
DO 10 I = 1, 4
10 X(I) = Y(I)
RETURN
END
DOUBLE PRECISION FUNCTION ROUND(X)
DOUBLE PRECISION X,Y,Z,E,H
DATA H/1.0D9/
Z = DABS(X)
Y = Z + 1.0D0
IF (Y .EQ. Z) GO TO 40
Y = 0.0D0
E = H
10 IF (E .GE. Z) GO TO 20
E = 2.0D0*E
GO TO 10
20 IF (E .LE. H) GO TO 30
IF (E .LE. Z) Y = Y + E
IF (E .LE. Z) Z = Z - E
E = E/2.0D0
GO TO 20
30 Z = IDINT(Z + 0.5D0)
Y = Y + Z
IF (X .LT. 0.0D0) Y = -Y
ROUND = Y
RETURN
40 ROUND = X
RETURN
END
FUNCTION DFLOAT(I)
C
C THIS IS THE AMIGA FUNCTION WHICH CONVERTS INTEGERS TO DOUBLE FLOATS
C
IMPLICIT NONE
DFLOAT = DBLE(I)
RETURN
END
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.